# Create your views here.
from django.views import View

'''
需求：
    获取省份信息
前端：
    当页面加载的时候 发送axsio请求 获取省份信息
后端：
    请求：
        不需要参数
    业务逻辑：
        查询省份信息
    响应：
        json
    路由：
        areas/
    步骤：
        查询省份信息
        将查询结果集转换为字典数据
        返回响应
'''

# areas/
# ----------------查询省份信息
from apps.areas.models import Area
from django.http import JsonResponse
from django.core.cache import cache


class AreaView(View):
    def get(self, request):
        try:
            # 先查询缓存数据 如果有的话就可以直接返回
            provinces_list = cache.get('province')
            print(provinces_list)
            # 如果没有缓存数据 就在数据库中查询 并写入缓存
            if provinces_list is None:
                # 在数据库中查询
                # 查询省份信息
                provinces = Area.objects.filter(parent=None)  # 查询结果集
                provinces_list = []
                for province in provinces:
                    provinces_list.append({
                        'province_id': province.id,
                        'province_name': province.name
                    })
                # 写入缓存
                cache.set('province', provinces_list, 24 * 3600)
        except:
            return JsonResponse({'code': 400, 'errmsg': '数据错误'})
        return JsonResponse({'code': 0, 'errmsg': 'ok', 'provinces': provinces_list})


'''
需求：
    获取市级信息
前端：
    当页面修改省市的时候 发送axsio请求 获取下一级信息
    传递省id
后端：
    请求：
        获取省id
    业务逻辑：
        查询市级信息 将查询结果集转换为字典数据
    响应：
        json
    路由：
        areas/province_id/
    步骤：
        获取省份id 查询信息
        将查询结果集转换为字典数据
        返回响应
'''


# areas/province_id/
# ----------------查询市级信息
class SubView(View):
    def get(self, request, province_id):
        try:
            # 先查询缓存
            cities_list = cache.get('city:%s' % province_id)
            print(cities_list)
            #  如果没有缓存数据 就在数据库中查询 并写入缓存
            if cities_list is None:

                # 获取省份id 查询信息
                province = Area.objects.get(id=province_id)  # 省
                cities = province.subs.all()  # 市
                cities_list = []
                for city in cities:
                    cities_list.append(
                        {
                            'city_id': city.id,
                            'city_name': city.name
                        }
                    )
                # 写入缓存
                cache.set('city:%s' % province_id, cities_list, 24 * 3600)

        except:
            return JsonResponse({'code': 400, 'errmsg': '数据错误'})
        return JsonResponse({
            'code': 0,
            'errmsg': 'ok',
            'sub_data': {'subs': cities_list}
        })


'''
需求：
    获取区县信息
前端：
    当页面修改省份 市级 的时候 发送axsio请求 获取下一级信息
    传递省id 市级id
后端：
    请求：
        获取省id 市级id
    业务逻辑：
        查询市级信息 将查询结果集转换为字典数据
    响应：
        json
    路由：
        areas/id/city_id
    步骤：
        获取省份id 市级id 查询信息
        将查询结果集转换为字典数据
        返回响应
'''


# areas/province_id/city_id
# ----------------查询区县信息


class LocView(View):
    def get(self, request, province_id, city_id):
        try:
            # 先查询缓存
            locs_list = cache.get('loc:%s' % city_id)
            #  如果没有缓存数据 就在数据库中查询 并写入缓存
            if locs_list is None:

                # 获取省份id 查询信息
                pro = Area.objects.get(id=province_id)
                city = pro.subs.all().get(id=city_id)  # 市
                # city = Area.objects.get(id=city_id)  # 市
                locs = city.subs.all()  # 区县
                locs_list = []
                for loc in locs:
                    locs_list.append(
                        {
                            'loc_id': loc.id,
                            'loc_name': loc.name
                        }
                    )
                # 写入缓存
                cache.set('loc:%s' % city_id, locs_list)
        except:
            return JsonResponse({'code': 400, 'errmsg': '数据错误'})
        return JsonResponse({
            'code': 0,
            'errmsg': 'ok',
            'sub_data': {'subs': locs_list}
        })

# 不经常发生变化的数据 最好放到redis中 减少数据库的查询
